using System;
using Csla;
using Ent.AccesoDatos;
using System.Collections.Generic;

namespace Ent.Inscripcion.Core.Core
{
    [Serializable]
    public class Registro : BusinessBase<Registro>
    {
        #region Business Methods

        private static PropertyInfo<Guid> IdProperty = RegisterProperty<Guid>(o => o.Id, "Name");
        public Guid Id
        {
            get { return GetProperty(IdProperty); }
            set { SetProperty(IdProperty, value); }
        }

        private static PropertyInfo<string> IdentificacionProperty = RegisterProperty<string>(o => o.Identificacion, "Name");
        public string Identificacion
        {
            get { return GetProperty(IdentificacionProperty); }
            set { SetProperty(IdentificacionProperty, value); }
        }

        private static PropertyInfo<string> CodigoProperty = RegisterProperty<string>(o => o.Codigo, "Name");
        public string Codigo
        {
            get { return GetProperty(CodigoProperty); }
            set { SetProperty(CodigoProperty, value); }
        }

        private static PropertyInfo<string> EmailProperty = RegisterProperty<string>(o => o.Email, "Name");
        public string Email
        {
            get { return GetProperty(EmailProperty); }
            set { SetProperty(EmailProperty, value); }
        }

        private static PropertyInfo<DateTime> FechaProperty = RegisterProperty<DateTime>(o => o.Fecha, "Name");
        public DateTime Fecha
        {
            get { return GetProperty(FechaProperty); }
            set { SetProperty(FechaProperty, value); }
        }

        private static PropertyInfo<int> EstadoProperty = RegisterProperty<int>(o => o.Estado, "Name");
        public int Estado
        {
            get { return GetProperty(EstadoProperty); }
            set { SetProperty(EstadoProperty, value); }
        }

        #endregion

        #region Validation Rules

        protected override void AddBusinessRules()
        {
            // TODO: add validation rules
            //ValidationRules.AddRule(RuleMethod, "");
        }

        #endregion

        #region Factory Methods

        public static Registro NewRegistro()
        {
            return DataPortal.Create<Registro>();
        }

        public static Registro GetRegistro(Guid id)
        {
            return DataPortal.Fetch<Registro>(id);
        }

        public static Registro GetRegistro(string identificacion)
        {
            return DataPortal.Fetch<Registro>(identificacion);
        }

        public static void DeleteRegistro(Guid  id)
        {
            DataPortal.Delete<Registro>(new SingleCriteria<Registro, Guid>(id));
        }

        private Registro()
        { LoadProperty(IdProperty, Guid.NewGuid()); }

        #endregion

        #region Data Access

        [RunLocal]
        protected override void DataPortal_Create()
        {
            // TODO: load default values
            // omit this override if you have no defaults to set
            base.DataPortal_Create();
        }

        private void DataPortal_Fetch( Guid criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro> {new Parametro("Id", criteria), new Parametro("Identificacion", "")};
            var datos = accesoDatos.EjecutarReader("ConsultarRegistro", parametros);
            if (datos.Datos.Read())
            {
                LoadProperty(IdProperty, Guid.Parse(datos.Datos.GetString(0)));
                LoadProperty(IdentificacionProperty, datos.Datos.GetString(1));
                LoadProperty(FechaProperty, DateTime.Parse(datos.Datos.GetString(2)));
                LoadProperty(CodigoProperty, datos.Datos.GetString(3));
                LoadProperty(EmailProperty, datos.Datos.GetString(4));
                LoadProperty(EstadoProperty, datos.Datos.GetInt32(5));
            }
            if (!datos.Datos.IsClosed) datos.Datos.Close();
        }

        private void DataPortal_Fetch(string criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro> {new Parametro("Id", ""), new Parametro("Identificacion", criteria)};
            var datos = accesoDatos.EjecutarReader("ConsultarRegistro", parametros);
            if (datos.Datos.Read())
            {
                LoadProperty(IdProperty, Guid.Parse(datos.Datos.GetString(0)));
                LoadProperty(IdentificacionProperty, datos.Datos.GetString(1));
                LoadProperty(FechaProperty, DateTime.Parse(datos.Datos.GetString(2)));
                LoadProperty(CodigoProperty, datos.Datos.GetString(3));
                LoadProperty(EmailProperty, datos.Datos.GetString(4));
                LoadProperty(EstadoProperty, datos.Datos.GetInt32(5));
            }
            if (!datos.Datos.IsClosed) datos.Datos.Close();
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Insert()
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro>
                                 {
                                     new Parametro("Identificacion", ReadProperty(IdentificacionProperty)),
                                     new Parametro("Codigo", ReadProperty(CodigoProperty)),
                                     new Parametro("Email", ReadProperty(EmailProperty)),
                                     new Parametro("Estado", ReadProperty(EstadoProperty)),
                                     new Parametro("Id", ReadProperty(IdProperty))
                                 };
            accesoDatos.EjecutarQuery("InsertarRegistro", parametros);
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Update()
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro>
                                 {
                                     new Parametro("Identificacion", ReadProperty(IdentificacionProperty)),
                                     new Parametro("Codigo", ReadProperty(CodigoProperty)),
                                     new Parametro("Email", ReadProperty(EmailProperty)),
                                     new Parametro("Estado", ReadProperty(EstadoProperty)),
                                     new Parametro("Id", ReadProperty(IdProperty))
                                 };

            accesoDatos.EjecutarQuery("ActualizarRegistro", parametros);
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_DeleteSelf()
        {
            DataPortal_Delete(new SingleCriteria<Registro, Guid>(ReadProperty(IdProperty)));
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        private void DataPortal_Delete(SingleCriteria<Registro, Guid> criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro> {new Parametro("Id", ReadProperty(IdProperty))};
            accesoDatos.EjecutarQuery("EliminarRegistro", parametros);
        }

        #endregion
    }

    [Serializable]
    public class RegistroCmd : CommandBase<RegistroCmd>
    {
        string _Identificacion;
        public string Mensaje;

        #region Factory Methods

        public static RegistroCmd Execute(string Identificacion)
        {

            RegistroCmd cmd = new RegistroCmd(Identificacion);
            cmd.BeforeServer();
            cmd = DataPortal.Execute<RegistroCmd>(cmd);
            cmd.AfterServer();
            return cmd;
        }

        public RegistroCmd(string Identificacion)
        {
            _Identificacion = Identificacion;
        }

        #endregion

        #region Client-side Code

        // TODO: add your own fields and properties
        int _result;

        public int Result
        {
            get { return _result; }
        }

        private void BeforeServer()
        {
            // TODO: implement code to run on client
            // before server is called
        }

        private void AfterServer()
        {
            // TODO: implement code to run on client
            // after server is called
        }

        #endregion

        #region Server-side Code

        protected override void DataPortal_Execute()
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro>();
            parametros.Add(new Parametro("Identificacion", _Identificacion));
            var datos = accesoDatos.EjecutarScalar("VerificarRegistroIdentificacion", parametros);
                
            switch (datos.ToString())
            {
                case "-1":
                    Mensaje =ManejadorRecursos.GetRecurso("IdentificacionNoRegistrada");
                    _result = 1;
                    break;
                case "-2":
                    Mensaje = ManejadorRecursos.GetRecurso("IdentificacionRegistrada");
                    _result = 2;
                    break;
                default:
                    Mensaje = ManejadorRecursos.GetRecurso("NotificacionIngresoCodigo");
                    _result = 3;
                    break;
            }
        }

        #endregion
    }

    [Serializable]
    public class VerificaCodigoCmd : CommandBase<VerificaCodigoCmd>
    {
        string _Codigo;

        #region Factory Methods

        public static VerificaCodigoCmd Execute(string Codigo)
        {

            VerificaCodigoCmd cmd = new VerificaCodigoCmd(Codigo);
            cmd.BeforeServer();
            cmd = DataPortal.Execute<VerificaCodigoCmd>(cmd);
            cmd.AfterServer();
            return cmd;
        }

        public VerificaCodigoCmd(string Codigo)
        {
            _Codigo = Codigo;
        }

        #endregion

        #region Client-side Code

        // TODO: add your own fields and properties
        bool _result;

        public bool Result
        {
            get { return _result; }
        }

        private void BeforeServer()
        {
            // TODO: implement code to run on client
            // before server is called
        }

        private void AfterServer()
        {
            // TODO: implement code to run on client
            // after server is called
        }

        #endregion

        #region Server-side Code

        protected override void DataPortal_Execute()
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro>();
            parametros.Add(new Parametro("Codigo", _Codigo));
            var datos = accesoDatos.EjecutarScalar("VerificarCodigoRegistro", parametros);
            int res;
            int.TryParse(datos.ToString(),out res);
            _result=res==0;
        }

        #endregion
    }
}
